Julia 边界检查
阐述
Julia 代码中可以用 @boundscheck
标出涉及到边界检查的代码,对于内置类型和自定义类型都适用。
而 @inbounds
宏可以将被操作的代码中包含的 @boundscheck
或者内联到这段代码中的函数的 @boundscheck
移除。为了避免引起意外,内联只会处理一层,更深的内联就不会再处理了。
如果希望 @inbounds
可以穿透这层函数处理更深入的 @boundscheck
,可以在定义的时候用 Base.@propagate_inbounds
来标注。
在绕过边界检查的情况下,程序可能会变得内存不安全,所以需要小心使用。
调用栈
checkbounds(A, I...)
调用checkbounds(Bool, A, I...)
调用checkbounds_indices(Bool, axes(A), I)
递归调用checkindex
每一维度
对于自定义 Julia 阵列类型,
- 一般情况下只要
axes
有定义,就可以使用 - 如果有特殊的指标类型,可以特化
checkindex
- 如果有特殊的多维指标类型,可以特化
checkbounds_indices
- 一般情况下,可以特化
checkbounds(Bool, A, I...)
实例
function sum(A::AbstractArray)
r = zero(eltype(A))
for i in eachindex(A)
@inbounds r += A[i]
end
return r
end